// src/utils/scrollManager.ts
import useVisitedRouteStore from '@/store/modules/visited-routes'
import { RouteLocationNormalized } from 'vue-router'

/**
 * 定义一个滚动管理器接口，用于保存和获取滚动位置
 */
export interface ScrollManager {
  // 保存滚动位置的方法，path 为当前path，position 为滚动位置
  saveScrollPosition(path: string, position: number): void
  // 获取滚动位置的方法，path 为当前path，返回值为滚动位置或未定义
  getScrollPosition(path: string): number | undefined
  // 清理已失效的滚动位置数据，场景：tab删除后清理
  cleanScrollPosition(): void
}

// 创建一个 Map 实例，用于存储路由 fullPath 和滚动位置的键值对
const scrollPositions = new Map<string, number>()

/**
 * 实现一个滚动管理器实例，提供保存和获取滚动位置的功能
 */
export const scrollManagerInstance: ScrollManager = {
  /**
   * 保存滚动位置的方法
   * @param path 当前路由path
   * @param position 当前页面的滚动位置
   */
  saveScrollPosition(path: string, position: number) {
    scrollPositions.set(path, position)
  },
  /**
   * 获取滚动位置的方法
   * @param path 当前路由path
   * @returns 返回滚动位置或未定义，如果未找到滚动位置
   */
  getScrollPosition(path: string): number | undefined {
    return scrollPositions.get(path)
  },
  /**
   * 清理已失效的滚动位置数据
   */
  cleanScrollPosition() {
    // 获取访问过的路由存储器实例
    const visitedRouteStore = useVisitedRouteStore()
    // 获取当前访问过的路由列表
    const visitedRoutes = visitedRouteStore.getVisitedRoutes
    // 遍历滚动位置数据
    scrollPositions.forEach((_, key) => {
      // 检查当前滚动位置对应的路由是否仍在访问过的路由列表中
      if (!visitedRoutes.some((it: RouteLocationNormalized) => it.path === key)) {
        scrollPositions.delete(key)
      }
    })
  },
}
